//============================================================================
// Nome        : Dados.cpp
// Autores     : T1G7
//                                      Felipe Galvão do Espírito Santo
//                                      Ivanilda Maísa Costa Brazão de Almeida
//                                      Paulo Jorge de Faria dos Reis
// Versão      : 1.0
// Data        : Maio de 2011
// Copyright   : Creative Commons 2.0
// Descrição   : CAL 2011 - TG1
//               Tema 12 - Transporte de pacientes de uma clínica de saúde.
//============================================================================

#include "Dados.h"

Dados::Dados()
{
}


Dados::~Dados()
{
}

//! Recupera a informa��o previamente guardada num ficheiro reconstruindo toda a estrutura de dados.
int Dados::carregarDados(string nomeFicheiro, const string separadores)
{
	nomeFicheiro = "..\\arquivo\\" + nomeFicheiro;	//! Ficheiro de entrada
string linha;						//! Guarda uma linha do ficheiro de entrada
	vector<string> itens;			//! Usado para separar a linha em substrings
	unsigned int dias, qtdItens;	//! Valores auxiliares no processamento

	ifstream fArquivo (nomeFicheiro.c_str());	//! Abrir para leitura o ficheiro de arquivo.

	if(!fArquivo.is_open()) return -1;			 //! Falha a abrir o ficheiro de arquivo.

	//! A partir daqui come�amos a ler o ficheiro
	getline(fArquivo, linha);					//! Ler uma linha
	itens.clear();								//! Garantir que o vector onde vamos receber os dados individuais est� limpo.
	separador(linha, itens, separadores);

	//! Os dados da Empresa.
	nomeEmpresa = itens[0];

	//! A lista de clientes.
	getline(fArquivo, linha);					//! L� a linha onde est� a quantidade de clientes.
	itens.clear();
	separador(linha, itens, separadores);
	qtdItens = stringParaInteiro(itens[0]);		//! Passa para inteiro o valor lido anteriormente.
	for(unsigned int i = 0; i < qtdItens; i++)			//! Le as linhas correspondentes a clientes.
	{
		getline(fArquivo, linha);				//! Le a linha que contem a informa��o de um cliente.
		Clientes.push_back(new Cliente(linha));	//! Cria um cliente e coloca o seu apontador no vector respectivo.
	}

	//! A frota de veiculos.
	getline(fArquivo, linha);					//! L� a linha onde est� a quantidade de veiculos.
	itens.clear();
	separador(linha, itens, separadores);		//! Quantidade de veiculos da frota.
	qtdItens = stringParaInteiro(itens[0]);
	for(unsigned int i = 0; i < qtdItens; i++)			//! L� as linhas de informa��o de veiculos.
	{
		getline(fArquivo, linha);
		Frota.push_back(new Veiculo(linha, separadores));	//! Cria um veiculo e coloca o seu apontador no vector respectivo.
	}

	//! Consultas
	getline(fArquivo, linha);					//! L� a linha onde est� a quantidade de dias registados na Agenda.
	itens.clear();
	separador(linha, itens, separadores);
	dias = stringParaInteiro(itens[0]);			//! Quantidade de dias na Agenda.
	for(unsigned int i = 0; i < dias; i++)				//! Percorre todos os dias da Agenda.
	{
		getline(fArquivo, linha);				//! Dados especificos de um dia.
		Agenda.push_back(new Consultas(linha));	//! Regista um novo dia na agenda.

		getline(fArquivo, linha);				//! Quantidade de consulta do dia.
		itens.clear();
		separador(linha, itens, separadores);
		qtdItens = stringParaInteiro(itens[0]);	//! Quantidade de consultas num dia.
		for(unsigned int j = 0; j < qtdItens; j++)
		{
			getline(fArquivo, linha);			//! L� a informa��o de uma consulta.
			Agenda[i]->novaConsulta(linha);		//! Introduz uma consulta neste dia.
		}
	}







	return 0;	//! O ficheiro foi lido com sucesso.
}

//! Esta fun��o abre o ficheiro que est� guardado na pasta arquivo cujo nome � nomeFicheiro.
void Dados::escreverDados(string nomeFicheiro, const string separador = "|")
{
	ofstream fArquivo(("..\\arquivo\\" + nomeFicheiro).c_str());	//! Abrir o ficheiro para arquivo dos dados.
	// A primeira linha identifica o nome da empresa.
	fArquivo << separador << nomeEmpresa << separador << endl;

	// Guardar os Clientes.
	int qtdeClientes = Clientes.size();
	fArquivo << separador << qtdeClientes << separador << endl;
	for(int i = 0; i < qtdeClientes; i++)
	{
		fArquivo << Clientes[i]->guardar(separador) << endl ;
	}

	// Guardar os Veiculos.
	int qtdeVeiculos = Frota.size();
	fArquivo << separador << qtdeVeiculos << separador << endl;
	for(int i = 0; i < qtdeVeiculos; i++)
	{
		fArquivo << Frota[i]->guardar(separador) << endl ;
	}

	// Guardar as Consultas.
	int dias = Agenda.size();
	fArquivo << separador << dias << separador << endl;
	for(int i = 0; i < dias; i++)
	{
		//! Agenda � um vecto de Consultas, que por sua vez s�o compostas pelas consulta de um mesmo dia.
		fArquivo << Agenda[i]->guardar(separador) << endl ;	//! Dados especificos de um dia de consultas.
		int qtdeConsultasDoDia = Agenda[i]->qtdeConsultas();
		fArquivo << separador << qtdeConsultasDoDia << separador << endl;
		for(int j = 0; j < qtdeConsultasDoDia; j++)
		{
			fArquivo << Agenda[i]->consultaPorIndice(j)->guardar(separador) << endl ;	//! Dados especificos de uma consulta individual.
		}
	}

	// Guardar as Sucursais.
	int qtdeSucursais = Sucursais.size();
	fArquivo << separador << qtdeSucursais << separador << endl;
	for(int i = 0; i < qtdeSucursais; i++)
	{
		fArquivo << Sucursais[i]->guardar(separador) << endl ;
	}
}

// Fun��es relacionadas com Sucursais.
void Dados::abrirSucursal(Sucursal* novaSucursal)
{
	Sucursais.push_back(novaSucursal);
}


// Fun��es relacionadas com Clientes.
void Dados::novoCliente(Cliente* utente)
{
	Clientes.push_back(utente);
}

void Dados::novoCliente(string _nome, string _morada, string _identificador, string _latitude, string _longitude, string _projX, string _projY)
{

}



// Fun��es relacionadas com Veiculos.
void Dados::novoVeiculo(Veiculo* carro)
{
	Frota.push_back(carro);
}


// Fun��es relacionadas com Consultas.

